#include <stdio.h>

// 定义一个 char 型二级指针以及一个指针数组，初始化指针数组，
// 并使用二级指针对指针数组进行处理，输出指针数组中指向地址存放的字符串

int main()
{
    int i;

    // 二级指针（指向指针的指针），用于间接访问指针数组元素
    // 可指向char*类型的变量（即指针数组的元素）
    char **p;

    // 指针数组：数组元素为char*类型（字符串指针）
    // 指针数组str：存储多个字符串的首地址，本质是“指针的数组”，每个元素都是独立的字符串指针
    char *str[] = {"My", "first", "C", "Language"};

    for (i = 0; i < 4; i++) {
        printf("str[%d]=%s P:%p\n", i, str[i], str[i]);
    }
    printf("\n");

    // 计算数组元素个数
    int len = sizeof(str) / sizeof(str[0]);
    // 输出：len: 4（因str包含4个字符串指针）
    printf("len: %d\n", len);

    for (i = 0; i < len; i++)
    {
        // 二级指针p指向数组str的第i个元素（即str[i]的地址）
        // str是数组名，代表数组首元素（str[0]）的地址，类型为char**（指向char*的指针）。
        // str + i：通过指针运算，获取数组第i个元素（str[i]）的地址，赋值给二级指针p，此时p指向str[i]
        p = str + i;
        // 打印地址与字符串
        printf("mem: %#X - str[%d]=%s\n", *p, i, *p);
    }

    return 0;
}